import {
	getUserInfo
} from '@/api/user'
import {
	passwordLogin,
	webSmsLogin,
	weixinMiniAppLogin,
	logout
} from '@/api/auth'

const AccessTokenKey = 'ACCESS_TOKEN'
const RefreshTokenKey = 'REFRESH_TOKEN'
const TOKENEXPIRESTIME = 'TOKEN_EXPIRESTIME'
const USERID = 'USERID'
const USERINFO = 'USERINFO'
const user = {
	state: {
		accessToken: uni.getStorageSync(AccessTokenKey), // 访问令牌
		refreshToken: uni.getStorageSync(RefreshTokenKey), // 刷新令牌
		userId: uni.getStorageSync(USERID),
		userInfo: uni.getStorageSync(USERINFO),
	},
	mutations: {
		// 更新 state 的通用方法
		SET_STATE_ATTR(state, param) {
			if (param instanceof Array) {
				for (let item of param) {
					state[item.key] = item.val
				}
			} else {
				state[param.key] = param.val
			}
		},
		// 更新令牌
		SET_TOKEN(state, data) {
			// 设置令牌
			const {
				accessToken,
				refreshToken,
				expiresTime,
				userId,
			} = data
			state.accessToken = accessToken
			state.refreshToken = refreshToken
			uni.setStorageSync(AccessTokenKey, accessToken)
			uni.setStorageSync(RefreshTokenKey, refreshToken)
			uni.setStorageSync(TOKENEXPIRESTIME, expiresTime)
			uni.setStorageSync(USERID, userId)

		},
		// 更新用户信息
		SET_USER_INFO(state, data) {
			state.userInfo = data
			uni.setStorageSync(USERINFO, data)
		},
		// 清空令牌 和 用户信息
		CLEAR_LOGIN_INFO(state) {
			uni.removeStorageSync(AccessTokenKey)
			uni.removeStorageSync(RefreshTokenKey)
			uni.removeStorageSync(TOKENEXPIRESTIME)
			uni.removeStorageSync(USERID)
			uni.removeStorageSync(USERINFO)
			state.accessToken = ''
			state.refreshToken = ''
			state.userId = ""
			state.userInfo = {}
			uni.reLaunch({
				url: "/pages/login/login"
			})
		}
	},
	actions: {
		//账号登录
		Login({
			state,
			commit
		}, {
			type,
			data
		}) {
			if (type === 0) {
				return passwordLogin(data)
					.then(res => {
						commit('SET_TOKEN', res.data)
						return Promise.resolve(res)
					})
					.catch(err => {
						return Promise.reject(err)
					})
			} else if (type === 1) {
				return webSmsLogin(data)
					.then(res => {
						commit('SET_TOKEN', res.data)
						return Promise.resolve(res)
					})
					.catch(err => {
						return Promise.reject(err)
					})
			} else {
				return weixinMiniAppLogin(data)
					.then(res => {
						commit('SET_TOKEN', res.data)
						return Promise.resolve(res)
					})
					.catch(err => {
						return Promise.reject(err)
					})
			}
		},
		// 退出登录
		Logout({
			state,
			commit
		}) {
			return logout()
				.then(res => {
					return Promise.resolve(res)
				})
				.catch(err => {
					return Promise.reject(err)
				})
				.finally(() => {
					commit('CLEAR_LOGIN_INFO')
				})
		},
		// 获得用户基本信息
		async ObtainUserInfo({
			state,
			commit
		}) {
			const res = await getUserInfo()
			commit('SET_USER_INFO', res.data)
		}
	}
}
export default user